CREATE OR REPLACE 
FUNCTION ubicacionActual 
RETURN NUMBER 
AS
zonaActual NUMBER:=0;
v_estadia         ESTADIA%ROWTYPE;
fechaAux VARCHAR2(50);
idPuertoLlegada NUMBER :=0;
BEGIN   
	FOR v_estadia IN
	(SELECT es.id,es.idPuerto, es.fechaSalida,es.fechaLlegada from ESTADIA es 
	where es.id = (select MAX(est.id) from estadia est)
	group by es.id,es.idPuerto, es.fechaSalida,es.fechaLlegada) LOOP	
	
	fechaAux :=  to_char(v_estadia.fechaSalida,'dd/mm/yyyy');	

	if (fechaAux is null) then 
		zonaActual := 	ZonaPuertoActual(v_estadia.idPuerto);		
	else
		select r.idPuertoLlegada into idPuertoLlegada from RUTAVIAJE r where r.estatus = 1 and r.idPuertoSalida = v_estadia.idPuerto;
		zonaActual := ZonaPuertoActual(idPuertoLlegada);
	 end if;
	END LOOP;

RETURN zonaActual;
/*Funcion que retorna la zona actual enla que se encuentra el barco*/
END;
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION ZonaPuertoActual 
(idPuertoActual IN NUMBER ) RETURN NUMBER
AS
idZonaPuertoActual NUMBER;
BEGIN   
	SELECT z.id into idZonaPuertoActual FROM zona z, puerto p,lugar l WHERE p.id = idPuertoActual and p.idLugar = l.id and l.idZona = z.id;

RETURN idZonaPuertoActual;
/*Funcion que segun el puerto retorna la zona actual*/
END;
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION calculoDiasRecorrido (velocidad NUMBER,millasNauticas NUMBER) 
RETURN NUMBER 
AS 

millasPorHora NUMBER(10,2);
horasRecorrido NUMBER(10,2);
diasRecorrido NUMBER(10,2);
recorridoUnKilometro NUMBER(10,2);
kilometrosRecorridos NUMBER(10,2);

BEGIN  

recorridoUnKilometro := 1.6093;
kilometrosRecorridos := (velocidad*recorridoUnKilometro);
millasPorHora := (kilometrosRecorridos* 0.5399);

horasRecorrido := millasNauticas/millasPorHora;
diasRecorrido := round(horasRecorrido/24);

DBMS_OUTPUT.PUT_LINE('Horas recorrido: '|| horasRecorrido|| ' horas');
DBMS_OUTPUT.PUT_LINE('Dias recorrido: '|| diasRecorrido|| ' dias');

RETURN horasRecorrido;
END;
/*Funcion que segun la velociadad y la distancia retorna las horas de recorrido*/
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION tiempoSalidaSeg 
(puerto  IN NUMBER)
RETURN NUMBER 
AS 
segundos VARCHAR2(10);
BEGIN 
	select to_char(r.fecha,'SSSSS') into segundos from RUTAVIAJE  r where r.estatus = 1 and r.idPuertoSalida = puerto;
  RETURN segundos;
/*Funcion que segun el puerto retorna la hora en que salio en segundos*/
END;
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION GASACTUAL
RETURN NUMBER 
AS 
gas1 NUMBER;
gas2 NUMBER;
gas3 NUMBER;
gas4 NUMBER;
BEGIN   
		Select r.gasactual into gas1 from registrocombustible r where r.fecha = (select max(fecha) from registrocombustible where tanqueactual = 1) and r.tanqueactual = 1;
		Select r.gasactual into gas2 from registrocombustible r where r.fecha = (select max(fecha) from registrocombustible where tanqueactual = 2) and r.tanqueactual = 2;
		Select r.gasactual into gas3 from registrocombustible r where r.fecha = (select max(fecha) from registrocombustible where tanqueactual = 3) and r.tanqueactual = 3;
		Select r.gasactual into gas4 from registrocombustible r where r.fecha = (select max(fecha) from registrocombustible where tanqueactual = 4) and r.tanqueactual = 4;
		return gas1+gas2+gas3+gas4;
END;
/*Funcion que retorna el combustible actual*/
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION calculoClima (mes IN VARCHAR2, zona IN NUMBER)
RETURN VARCHAR2
AS 
v_registroclima registroclima%ROWTYPE;
sumTemperatura Number;
sumPluviosidad Number;
sumHumedad Number;
countRegistros Number;
calculoTemperatura Number;
calculoPluviosidad Number;
calculoHumedad Number;
calculoNubosidad Varchar2(1);
resultado Varchar2(1);
countM Number;
countN Number;
countP Number;


BEGIN   
sumTemperatura := 0;
sumPluviosidad := 0;
sumHumedad := 0;
countRegistros :=0;
countM := 0;
countN := 0;
countP := 0;


FOR v_registroclima IN
	(select r.temperatura, r.nubosidad, r.pluviosidad, r.humedad
	from registroclima r 
	where to_char(r.fecha,'MM') = mes 
	and r.idZona = zona) LOOP

	countRegistros := countRegistros+ 1;

	sumTemperatura := sumTemperatura+ v_registroclima.temperatura;
	sumPluviosidad := sumPluviosidad + v_registroclima.pluviosidad;
	sumHumedad := sumHumedad + v_registroclima.humedad;

	if (v_registroclima.nubosidad = 'M') then
		countM := countM +1;
	end if;
	if (v_registroclima.nubosidad = 'N') then
		countN := countN +1;
	end if;
if (v_registroclima.nubosidad = 'P') then
	countP := countP +1;
end if;


END LOOP;

	if (countM > countN ) then
		if (countM > countP ) then
			calculoNubosidad :='M';
		else
			calculoNubosidad := 'P';
		end if;
	elsif (countN > countP)  then
	 	   calculoNubosidad := 'N';
	else
		calculoNubosidad := 'P';
		
		
	end if;



	calculoTemperatura := round(sumTemperatura/countRegistros);
	calculoPluviosidad := round(sumPluviosidad/countRegistros);
	calculoHumedad := round(sumHumedad/countRegistros);


	if(calculoTemperatura > 20) then
		resultado := 'T';
	end if;
	if(calculoTemperatura < 20) then
		resultado := 'R';
	end if;


	if(calculoPluviosidad > 40) then
		resultado := 'T';
	end if;
	if(calculoPluviosidad < 40) then
		resultado := 'R';
	end if;


	if(calculoHumedad > 40) then
		resultado := 'T';
	end if;
	if(calculoHumedad < 40) then
		resultado := 'R';
	end if;

	if(calculoNubosidad = 'P') then
		resultado := 'T';
	end if;
	if(calculoNubosidad = 'N') then
		resultado := 'T';
	end if;
	if(calculoNubosidad = 'M') then
		resultado := 'R';
	end if;




	/*DBMS_OUTPUT.PUT_LINE('Temperatura:  '    || calculoTemperatura);
	DBMS_OUTPUT.PUT_LINE('Nuvosidad:  '    || calculoNubosidad);
	DBMS_OUTPUT.PUT_LINE('Pluviosidad:  '    || calculoPluviosidad);
	DBMS_OUTPUT.PUT_LINE('Humedad:  '    || calculoHumedad||'%');*/

	RETURN resultado ; 
/*Funcion que segun la zona y el mes retorna si la zona esta en Tranquilidad o Riesgo*/
END;
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION calculoVelocidadPromedio(velocidadMax IN NUMBER) RETURN NUMBER
AS 
BEGIN   

	/*Con la velocidad maxima del barco y sabemos que los vientos cuando estan en su mayor intensidad y a favor del curso del barco hace que la velocidad aumente en un 25% se calcula la velocidad
	promedio de la siguiente forma velocidadMaxima := velocidad Promedio + velocidadPromedio x 0.25*/
	RETURN ROUND(velocidadMax / (1 +.25));
END;
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION combustibleAproximado (puertoSalida IN NUMBER, puertoLlegada IN NUMBER,velocidadMaximaBarco IN NUMBER)
RETURN NUMBER 
AS
distancia NUMBER :=0;
velocidadPromedio NUMBER :=0;
recorridoEnSeg NUMBER :=0;
horasRecorridoAux NUMBER :=0;
horaSalidaSeg NUMBER:=0;
fechaEstimadaLlegada DATE;
horaSalida NUMBER := 0;
horasDia NUMBER := 0;
horasNoche NUMBER := 0;
gastoTotal NUMBER := 0;
BEGIN   

	select pp.distancia into distancia from puertoapuerto pp where pp.idPuertoSalida= puertoSalida and pp.idPuertoLlegada = puertoLlegada;

	velocidadPromedio := calculoVelocidadPromedio(velocidadMaximaBarco);

	recorridoEnSeg := calculoDiasRecorrido (velocidadPromedio,distancia) *3600;

	horaSalidaSeg := tiempoSalidaSeg(puertoSalida);

	

	FOR I IN 1..recorridoEnSeg LOOP

		if (horaSalidaSeg>86400) then
			horaSalidaSeg := 0;
		end if;

		if (horaSalidaSeg>=21600 and horaSalidaSeg<64800) then
			horasDia := horasDia +1;
		else
			horasNoche := horasNoche +1;
		end if;
			
		horaSalidaSeg := horaSalidaSeg + 1;

	END LOOP;

	horasDia := round(horasDia/3600);
	horasNoche := round(horasNoche/3600);

	DBMS_OUTPUT.PUT_LINE('recorrido '|| recorridoEnSeg/3600);
	DBMS_OUTPUT.PUT_LINE('horasDia '||horasDia);
	DBMS_OUTPUT.PUT_LINE('horasNoche '||horasNoche);

	gastoTotal := 1000*horasDia + 3000*horasNoche;

RETURN gastoTotal; 

/*Funcion que retorna el combustible aproximado a gastar entre un puerto y otro*/
END;

====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION RutasIguales
(ruta1 IN VARCHAR2 ,ruta2 IN VARCHAR2 )
RETURN NUMBER 
AS 
BEGIN   
	if (ruta1 = ruta2) then
		return 0;
	else
		return 1;
	end if;
END;
====================================================================================================================================================
CREATE OR REPLACE 
PROCEDURE crearRutaAlterna
AS
idZonaPuertoActual NUMBER;
idZonaPuertoProx NUMBER;
v_rutas         RUTAVIAJE%ROWTYPE;
type rutas_tipoarray is varray(1000) of RUTAVIAJE%rowtype;
array_rutaDefecto rutas_tipoarray := rutas_tipoarray();
type number_tipoarray is varray(200) of NUMBER;
array_puertos number_tipoarray := number_tipoarray();
array_puertosPosi number_tipoarray := number_tipoarray();
array_puertosNoPosi number_tipoarray := number_tipoarray();
indx   number := 1; 
indx2   number := 1;
mes varchar2(10);
climaResult varchar2(1);
zonaAux number :=1;
puertosPosibles VARCHAR2(10);
ultimitos VARCHAR2(10);
BEGIN   
	
	FOR v_rutas IN
	(SELECT r.idPuertoSalida,r.idPuertollegada,r.tipo FROM rutaviaje r WHERE r.estatus=1) LOOP
		
		if indx < array_rutaDefecto.limit then
		   array_rutaDefecto.extend;
		   array_puertos.extend;
		   array_rutaDefecto(array_rutaDefecto.last).idPuertoSalida := v_rutas .idPuertoSalida;
		   array_rutaDefecto(array_rutaDefecto.last).idPuertollegada := v_rutas .idPuertollegada;
		   array_rutaDefecto(array_rutaDefecto.last).tipo := v_rutas .tipo;
		  
		if (indx = 1) then 
			array_puertos(array_puertos.last):=1;
			array_puertos.extend;
			array_puertos(array_puertos.last) :=  array_rutaDefecto(array_rutaDefecto.last).idPuertollegada;	
		 else 			
			array_puertos(array_puertos.last) :=  array_rutaDefecto(array_rutaDefecto.last).idPuertollegada;
		 end if;

		  indx := indx +1;

		end if;

	END LOOP;

	mes := to_char(sysdate,'MM');
	DBMS_OUTPUT.PUT_LINE('mes:  '    || mes);

/*LOOP que llena los arreglos de los puertos posibles y los no posibles  de acuerdo al clima para la generacion de las rutas alternativas*/
	FOR I in 1..array_puertos.COUNT LOOP
		
		DBMS_OUTPUT.PUT_LINE('PUERTOS:  '    || 
		 array_puertos(I));
		zonaAux := zonaPuertoActual(array_puertos(I));
		climaResult :=calculoClima(mes,zonaAux);
		DBMS_OUTPUT.PUT_LINE('PUERTOS:  '    || 
		 array_puertos(I) || 'CLIMA RESULT: '||climaResult);
		array_puertosPosi.extend;
		array_puertosNoPosi.extend;
		if (climaResult = 'T') then			
			array_puertosPosi(array_puertosPosi.last):=array_puertos(I);
		else
			array_puertosNoPosi(array_puertosPosi.last):=array_puertos(I);
		end if;			
		
	END LOOP;
/*LOOP que convierte los puertos posibles de vararray a string*/
	FOR I in 1..array_puertosPosi.COUNT LOOP

		DBMS_OUTPUT.PUT_LINE('PUERTOS POSIBLWES:  '    || 
		 array_puertosPosi(I));
		puertosPosibles := puertosPosibles || to_char(array_puertosPosi(I),'9');
	END LOOP;

/*LOOP que convierte los puertos  NO posibles de vararray a string*/
	FOR I in 1..array_puertosNoPosi.COUNT LOOP

		DBMS_OUTPUT.PUT_LINE('PUERTOS NO POSIBLWES:  '    || 
		 array_puertosNoPosi(I));
		ultimitos := ultimitos || to_char(array_puertosNoPosi(I),'9');
	END LOOP;
/*Aqui se llama a la funcion que generara las 3 rutas alternas*/
	generarRutasAlternas(puertosPosibles,ultimitos);
	
	/*Funcion que se llama si se necesita crear rutas alternas a la que esta activa*/
END;
====================================================================================================================================================
CREATE OR REPLACE 
PROCEDURE generarRutasAlternas(posiblesPuertos  IN VARCHAR2,ultimos IN VARCHAR2 )
 AS
pepe         VARCHAR2(10);
LOLA POSARRAY := POSARRAY();
LOLA2 POSARRAY := POSARRAY();
indx NUMBER :=1;
countAux number:= 0;
cont NUMBER :=0;
verif NUMBER := 0;
BEGIN

	FOR pepe IN
	(select permutations from (select replace (sys_connect_by_path( n, ',' ) , ',' ) permutations from
	(select SUBSTR(posiblesPuertos,level,1) n from dual connect by level <= length(posiblesPuertos) ) YourTable
	connect by nocycle n!= prior n) where length(permutations) = length(posiblesPuertos)) LOOP
		
	DBMS_OUTPUT.PUT_LINE('Generar:  '    || posiblesPuertos);
		
		indx := indx +1;
		if indx < LOLA.limit then
		   LOLA.extend;
		   LOLA(LOLA.last) := pepe.permutations;	  
		   indx := indx +1;
		end if;
	END LOOP;

	if (length(ultimos) >1) then
	
		countAux := LOLA.COUNT;
		 FOR I IN 1..countAux LOOP

			
			LOLA.extend;
			LOLA(I + countAux):=LOLA(I) || SUBSTR(ultimos,length(ultimos),1) || SUBSTR(ultimos,1,1);

			LOLA(I):= LOLA(I) || ultimos;

		END LOOP;

	else

		FOR I IN 1..LOLA.COUNT LOOP			
			LOLA(I):=LOLA(I) || ultimos;	
		END LOOP;


	end if;
	

	FOR I IN 1..LOLA.COUNT LOOP

		verif :=  verificarRutas (LOLA(I));

		if (verif = 1) then
			insertarRutaAlterna(LOLA(I));
			DBMS_OUTPUT.PUT_LINE('lola '|| LOLA(I));
			cont := cont + 1;
		end if;
		exit when cont = 3;
	END LOOP;

/*Funcion que a partir de los puertos posibles y los que no se puede pasar genera las rutas alternas*/
END;
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION verificarRutas 
(rutaPosible IN VARCHAR2) RETURN NUMBER
AS
rutaPosibleAux varchar2(10);
puertoSalida NUMBER := 0;
puertoLlegada NUMBER := 0;
distancia NUMBER := 0;
type number_tipoarray is varray(200) of NUMBER;
array_puertos number_tipoarray := number_tipoarray();
combusAproximado NUMBER :=0;
combustibleActual NUMBER := 0;
BEGIN

	rutaPosibleAux := '1' || rutaPosible || '1';	

	FOR I IN 1..length(rutaPosibleAux) LOOP
		array_puertos.extend;
		array_puertos(array_puertos.COUNT):= to_number(SUBSTR(rutaPosibleAux,I,1));	
	END LOOP;

	FOR I IN 1.. array_puertos.COUNT LOOP

		if (I<>array_puertos.COUNT) then
			puertoSalida := array_puertos(I);
			puertoLlegada := array_puertos(I+1);
			combusAproximado := combustibleAproximado(puertoSalida, puertoLlegada,20);						
			combustibleActual := GASACTUAL;

			if ( combusAproximado >combustibleActual) then
				return 0;
			else
				return 1;
			end if;
		elsif (I = array_puertos.COUNT) then
			puertoSalida := array_puertos(array_puertos.COUNT);
			puertoLlegada :=1;
			
			combusAproximado := combustibleAproximado(puertoSalida, puertoLlegada,20);						
			combustibleActual := GASACTUAL;

			if ( combusAproximado >combustibleActual) then
				return 0;
			else
				return 1;
			end if;
		end if;
	END LOOP;
RETURN 1; 

/*Funcion que verifica si las rutas generadas aleatoriass son factibles de ser asi retorna 1 vceversa retorna 0*/
END;

====================================================================================================================================================
CREATE OR REPLACE 
PROCEDURE insertarRutaAlterna 
(rutaAlterna in VARCHAR2 )
AS
longAlterna NUMBER :=0;
type number_tipoarray is varray(200) of NUMBER;
array_puertos number_tipoarray := number_tipoarray();
distancia NUMBER;
puertoSalida NUMBER;
puertoLlegada NUMBER;
BEGIN   
	longAlterna := length(rutaAlterna);

	DBMS_OUTPUT.PUT_LINE('alterna:  '    || rutaAlterna);
	array_puertos.extend; 
	array_puertos(array_puertos.last):=1;

	FOR I in 1..longAlterna LOOP

		array_puertos.extend;
		array_puertos(array_puertos.COUNT):= to_number(SUBSTR(rutaAlterna,I,1));
	END LOOP;

	array_puertos.extend;
	array_puertos(array_puertos.last):=1;


	FOR I in 1..array_puertos.COUNT LOOP

		DBMS_OUTPUT.PUT_LINE('puertos VEC:  '    || array_puertos(I));
	END LOOP;

	DBMS_OUTPUT.PUT_LINE('puertos size:  '    || array_puertos.COUNT);

	FOR I in 1..array_puertos.COUNT-1 LOOP

		DBMS_OUTPUT.PUT_LINE('PUERTOS POSIBLES:  '    || 
		 array_puertos(I));
		if (I<>array_puertos.COUNT) then
			puertoSalida := array_puertos(I);
			puertoLlegada := array_puertos(I+1);
			select pp.distancia into distancia from puertoapuerto pp where pp.idPuertoSalida = puertoSalida and pp.idPuertoLlegada = puertoLlegada;

			insert into RUTAVIAJE VALUES (IDRUTAVIAJE.nextval,distancia,to_date(sysdate,'dd/mm/yyyy HH24:MI:SS'),'A',puertoSalida,puertoLlegada,0);
			commit;
		elsif (I = array_puertos.COUNT) then
			puertoSalida := array_puertos(array_puertos.COUNT);
			puertoLlegada :=1;
			select pp.distancia into distancia from puertoapuerto pp where pp.idPuertoSalida = puertoSalida and pp.idPuertoLlegada = puertoLlegada;
			insert into RUTAVIAJE VALUES (IDRUTAVIAJE.nextval,distancia,to_date(sysdate,'dd/mm/yyyy HH24:MI:SS'),'A',puertoSalida,puertoLlegada,0);
			commit;
		end if;

	END LOOP;
	
/*Funcion que inserta las 3 rutas alternas en la tabla rutaviaje*/	
END;
====================================================================================================================================================
CREATE OR REPLACE TRIGGER validarEstadiaPuerto BEFORE UPDATE OF FECHASALIDA ON ESTADIA REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
fechaLlegada DATE;
fechaSalida DATE;
horasEstadia NUMBER(10,2);
BEGIN

	select es.fechaLlegada into fechaLlegada from estadia es where es.id = :OLD.id;

	DBMS_OUTPUT.PUT_LINE('fechaLlegada: '  ||fechaLlegada);
	DBMS_OUTPUT.PUT_LINE('NEW id: ' || :NEW.id);
	horasEstadia := round ( (:OLD.fechaLlegada - :NEW.fechaSalida) * 24);
	
	IF (horasEstadia > 6) THEN
		DBMS_OUTPUT.PUT_LINE('La estadia del barco en un puerto no puede ser mayor a 6 horas');
	END IF;
/*Trigger que valida que la estadia en los puertos no sea mayor a 6 horas*/	
END;
====================================================================================================================================================
CREATE OR REPLACE 
PROCEDURE insertarInsumosViaje /*Deberia pasarle el viaje al que pertenece esta insercion LOGO*/
AS
v_alimento        	ALIMENTOLOTE%ROWTYPE;
v_lotes         		LOTE%ROWTYPE;
cantXRecetas        	NUMBER;
v_alimentosId		NUMBER;

type number_tipoarray is varray(1000) of NUMBER;
alimentos number_tipoarray := number_tipoarray();
cantidadesXreceta number_tipoarray := number_tipoarray();
lotesIds number_tipoarray := number_tipoarray();

type lote_tipoarray is varray(1000) of LOTE%rowtype;
lotesInfo lote_tipoarray := lote_tipoarray();

cantPasajeros NUMBER :=0;
cont NUMBER:=0;
indx   number := 1; 
idActualLote NUMBER := 0;
pesoLote NUMBER:= 0;
anchoL NUMBER :=0;
largoL NUMBER :=0;
altoL NUMBER :=0;
marcaL VARCHAR2(30);
idZonaAl NUMBER :=0;
pesoL NUMBER :=0;
maxIdLote NUMBER := 0;
 
BEGIN   

	FOR v_alimentosId IN
	(SELECT a.id from alimento a) LOOP
		
		if  ( indx < alimentos.limit ) then
		   alimentos.extend;
		   alimentos (alimentos.last) := v_alimentosId.id;
		   indx := indx + 1;
		end if;
		--DBMS_OUTPUT.PUT_LINE('idAlimento ' ||  alimentos (alimentos.last) );
	END LOOP;
	
	indx :=1;

	FOR I in 1..alimentos.COUNT LOOP
		
		select NVL(SUM(r.cantidad),0) into cantXRecetas from receta r where r.idAlimento = alimentos(I);
		if  ( indx < cantidadesXreceta.limit ) then
		   cantidadesXreceta.extend;
		   cantidadesXreceta (cantidadesXreceta.last) := cantXRecetas;
		   indx := indx + 1;				
		end if;
		
	END LOOP;

	cantPasajeros := cantidadPasajeros;--Habria que pasarle el id para obtener las cantidad de insumos para los pasajeros de un viaje en especifico

	indx := 1;

	FOR I in 1..alimentos.COUNT LOOP
		
		
		FOR idActualLote IN (select al.idLote lotesito from alimentoLOTe al where al.idAlimento = alimentos(I)) LOOP			

			cont :=0;
			if  ( indx < lotesIds.limit ) then
		   		lotesIds.extend;
		   		lotesIds (lotesIds.last) := idActualLote.lotesito;
				cont := cont + 1;
				EXIT WHEN cont =1;
		  		 indx := indx + 1;		
			end if;

		END LOOP;
		
	END LOOP;

	indx := 1;
	FOR I in 1..lotesIds.COUNT LOOP
		
		FOR v_lotes IN (select l.ancho,l.largo,l.alto,l.marca,l.idzonaalmacen from lote l where l.id = lotesIds(I) ) LOOP			

			pesoLote := calcularPesoLote(alimentos(I),cantidadesXreceta(I));
			if  ( indx < lotesInfo.limit ) then
		   		lotesInfo.extend;
		   		lotesInfo (lotesInfo.last).ancho := v_lotes.ancho;
				lotesInfo (lotesInfo.last).largo := v_lotes.largo;
				lotesInfo (lotesInfo.last).alto := v_lotes.alto;
				lotesInfo (lotesInfo.last).marca := v_lotes.marca;
				lotesInfo (lotesInfo.last).idzonaalmacen := v_lotes.idzonaalmacen;
				lotesInfo (lotesInfo.last).peso := pesoLote;
		  		 indx := indx + 1;		
			end if;

		END LOOP;
		
	END LOOP;

	FOR I in 1..lotesInfo.COUNT LOOP					

			if  (cantidadesXreceta(I)<>0) then
				
				FOR J in 1..7 LOOP
				--INSERT INTO LOTE VALUES (IDLOTE.nextval,270,240,130,0.330,TO_DATE('2010-02-21 16:50:27', 'YYYY-MM-DD HH24:MI:SS'),'Vegetales Gourmet',3);
		   			anchoL:= lotesInfo (I).ancho;
					largoL := lotesInfo (I).largo;
					altoL := lotesInfo (I).alto;
					marcaL:= lotesInfo (I).marca;
					idZonaAl := lotesInfo (I).idzonaalmacen;
					pesoL:= lotesInfo (I).peso;
					INSERT INTO LOTE VALUES (IDLOTE.nextval,anchoL,largoL,altoL,pesoL,add_months(TO_DATE(sysdate, 'YYYY-MM-DD HH24:MI:SS'),24),marcaL,idZonaAl);

					select MAX(l.id) into maxIdLote from lote l;
					INSERT INTO ALIMENTOLOTE VALUES (alimentos(I),maxIdLote,cantidadesXreceta(I)*cantPasajeros/2,cantidadesXreceta(I)*cantPasajeros,cantidadesXreceta(I)*cantPasajeros);
					commit;
				END LOOP;
			else
					anchoL:= lotesInfo (I).ancho;
					largoL := lotesInfo (I).largo;
					altoL := lotesInfo (I).alto;
					marcaL:= lotesInfo (I).marca;
					idZonaAl := lotesInfo (I).idzonaalmacen;
					pesoL:= lotesInfo (I).peso;
					INSERT INTO LOTE VALUES (IDLOTE.nextval,anchoL,largoL,altoL,pesoL,add_months(TO_DATE(sysdate, 'YYYY-MM-DD HH24:MI:SS'),24),marcaL,idZonaAl);

					select MAX(l.id) into maxIdLote from lote l;
					INSERT INTO ALIMENTOLOTE VALUES (alimentos(I),maxIdLote,cantPasajeros/2,cantPasajeros,cantPasajeros);
					
					commit;				
			end if;
		
	END LOOP;
/*Funcion que inserta los insumos de comida para un viaje en especifico de acuerdo a la cantidad de personas que van a viajar en el*/
END;
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION calcularPesoLote(idAlimento in NUMBER,cantidadLote in NUMBER) 
RETURN NUMBER 
AS
pesoAlimentoTons NUMBER := 0;
pesoLote NUMBER := 0;
BEGIN   

	select a.peso into pesoAlimentoTons from alimento a where a.id = idAlimento;
	pesoAlimentoTons := pesoAlimentoTons/1000;
	if (cantidadLote <>0) then				
		pesoLote := cantidadLote * pesoAlimentoTons;	
		RETURN pesoLote;
	elsif ( cantidadLote = 0) then
		pesoLote := cantidadPasajeros * pesoAlimentoTons;
		RETURN pesoLote;
	end if;

END;
====================================================================================================================================================
CREATE OR REPLACE 
FUNCTION cantidadPasajeros/*Hay que pasarle viaje*/ 
RETURN NUMBER 
AS
cantidadTotal NUMBER :=0; 
BEGIN   

	select COUNT(p.numpasaporte) into cantidadTotal from persona p;

RETURN cantidadTotal*132;
/*Cantidad de pasajeros sesgun viaje*/
END;
====================================================================================================================================================